로딩 중이에요... 🐣
[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
20 포스트 수정 기능 (POST 요청으로 수정 저장) | ✅ 편저: 코담 운영자
20강 - 포스트 수정 기능 (POST 요청으로 수정 저장)
포스트 수정 - post api 개발✨ 이번 강의 목표
- 포스트 수정 버튼을 통해 변경된 내용을 서버에 저장
- POST 요청 처리로 DB 반영 + 피드 페이지 리디렉션
- 기존 이미지가 유지되는 조건 분기까지 구현
1. 수정 요청 흐름
수정하기 버튼 클릭
↓
form(method="POST") 전송
↓
post_update 뷰 함수의 POST 분기 진입
↓
UpdatePostForm 으로 유효성 검증 → 저장
↓
피드 페이지로 리디렉션
2. 수정 뷰 함수 (POST 처리 포함)
파일: views.py
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.urls import reverse
from . import models
from .forms import UpdatePostForm
@login_required
def post_update(request, post_id):
post = get_object_or_404(models.Post, pk=post_id)
if post.author != request.user:
return redirect(reverse('users:main'))
if request.method == "GET":
form = UpdatePostForm(instance=post)
return render(request, 'posts/post_update.html', {'form': form, 'post': post})
elif request.method == "POST":
form = UpdatePostForm(request.POST, request.FILES, instance=post)
if form.is_valid():
# 이미지 파일이 없는 경우 원래 이미지 유지
if not request.FILES.get('image'):
form.instance.image = post.image
# 변경 사항 저장
post = form.save(commit=False)
post.author = request.user
post.save()
return redirect(reverse('posts:index'))
else:
# 유효성 검사 실패 시 오류 메시지 전달
return render(request, 'posts/post_update.html', {'form': form, 'post': post})
✅ 설명
instance=post
→ 기존 포스트에 덮어쓰기- 이미지 입력이 없을 경우 기존 이미지 유지
- commit=False로 객체만 생성 후 작성자 재할당
- form 에러 발생 시 기존 폼을 다시 렌더링하여 메시지 표시
3. POST 방식 수정 처리 설명
- 사용자가 수정 폼에서 수정하기 버튼 클릭 →
POST
전송 UpdatePostForm(request.POST, request.FILES, instance=post)
로 수정 대상 지정form.is_valid()
통과 시 저장, 실패 시 에러와 함께 다시 출력
4. 오류 메시지 처리 방법
템플릿 내 처리:
{{ form.non_field_errors }} <!-- 폼 전체 오류 -->
{{ form.caption.errors }} <!-- caption 개별 오류 -->
{{ form.image.errors }} <!-- image 개별 오류 -->
- 사용자가 올바르게 입력할 때까지 폼 유지 및 메시지 출력
5. 최신 글 우선 정렬 처리 (선택적 보완)
return Post.objects.filter(...).order_by("-created_at")
- 수정 시 updated_at이 변경되더라도, 작성일(created_at) 기준으로 정렬
- 피드에서는 최신 작성글이 위에 위치하도록 유지
✅ 정리
- POST 요청으로 게시글을 실제로 수정하는 기능 구현
- 기존 이미지 유지 조건, 작성자 확인 등 실무 필수 로직 포함
- 유효성 검사 실패 시 오류 메시지를 포함하여 다시 폼 출력
👉 다음 강의에서는 포스트 좋아요(Like) 기능을 구현합니다.